package com.mazaiting.common.core.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * 日期时间工具
 *
 * @author mazaiting
 * @create_time 2022/3/25 15:26
 */
public class DateTimeUtil {

    /**
     * 日期格式, 带/
     */
    public static final String YYYY_MM_DD_SLASH = "yyyy/MM/dd";
    /**
     * 日期格式
     */
    public static final String YYYY_MM_DD = "yyyy-MM-dd";
    /**
     * 时间日期格式
     */
    public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
    /**
     * 时间日期格式 - 带毫秒
     */
    public static final String YYYY_MM_DD_HH_MM_SS_SSS = "yyyy-MM-dd HH:mm:ss.SSS";


    /**
     * 将LocalDateTime时间转换成为字符串
     * @param dateTime 需要转换的时间
     * @return  返回已经格式化String时间
     */
    public static String time2String(LocalDateTime dateTime){
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS);
        return dateTime.format(dateTimeFormatter);
    }

    /**
     * 将LocalDateTime时间转换成为字符串
     * @param dateTime 需要转换的时间
     * @param pattern 格式
     * @return  返回已经格式化String时间
     */
    public static String time2String(LocalDateTime dateTime, String pattern){
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
        return dateTime.format(dateTimeFormatter);
    }

    /**
     * 将Long类型毫秒值时间转换成为字符串
     * @param currentTimeMilli 需要转换的时间
     * @return  返回已经格式化String时间
     */
    public static String time2String(Long currentTimeMilli){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
        return simpleDateFormat.format(currentTimeMilli);
    }

    /**
     * 将Long类型毫秒值时间转换成为字符串
     * @param t 需要转换的时间
     * @param format 时间格式
     * @return  返回已经格式化String时间
     */
    public static String time2String(Long t, String format){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        return simpleDateFormat.format(t);
    }

    /**
     * 将Date类型时间转换成为字符串
     * @param date 需要转换的时间
     * @return  返回已经格式化String时间
     */
    public static String time2String(Date date){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
        return simpleDateFormat.format(date);
    }


    /**
     * 将 Date 日期转换为 LocalDateTime
     * @param date 日期
     * @return LocalDateTime
     */
    public static LocalDateTime dateToLocalDateTime(Date date) {
        return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
    }

    /**
     * 将LocalDateTime时间转换成为字符串
     * @param dateTime 需要转换的时间
     * @return  返回已经格式化LocalDateTime时间
     */
    public static LocalDateTime string2LocalDateTime(String dateTime){
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS);
        return LocalDateTime.parse(dateTime, dateTimeFormatter);
    }

    /**
     * 该方法返回未来一个时间点
     * @param currentTime   当前时间
     * @param minute    分钟数，以分钟为单位
     * @return  返回的未来时间
     */
    public static Date getFutureDate(Long currentTime, Long minute){
        Long effectTime = minute * 60 * 1000L;
        return new Date(currentTime+effectTime);
    }

    /**
     * 字符串时间转换为Date
     * @param date  转换
     * @return  返回的未来时间
     */
    public static Date string2Date(String date){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
        Date parse = null;
        try {
            parse = simpleDateFormat.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return parse;
    }

    /**
     * 将LocalDateTime时间转换成为毫秒值
     * @param dateTime 需要转换的时间
     * @return  返回已经格式化String时间
     */
    public static Long localDateTime2Long(LocalDateTime dateTime){
        return dateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
    }

    /**
     * 未来时间：给一个分钟值例如（15）返回一个15分钟后的未来时间
     * @param minutes 需要转换的分钟值
     * @return  返回LocalDateTime的类型的的未来时间时间
     */
    public static LocalDateTime getFutureLocalDateTime(Long minutes){
        return LocalDateTime.now().minusMinutes(-minutes);
    }


}
